package com.fare.taluo.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

import com.fare.taluo.vo.core.CabinEntityVO;
import com.fare.taluo.vo.core.PlaneInfo;

/**
 * 工具类
 * @author Administrator
 *
 */
public class FusionChartsUtil_2 {
	public static final String DateFormat="yyyy-MM-dd";
	public static final SimpleDateFormat SimpleDateFormat=new SimpleDateFormat(DateFormat);
	public static final long OneDay=24*60*60*1000;
	private static final Map<String,String> SourceColorMap=new HashMap<String,String>();//每个渠道不同的颜色，报表专用
	private static final String[] randomColors=new String[]{//随机颜色
		"EE9A00","BA55D3","9ACD32","6A5ACD","CD0000","CDAD00","B0B0B0","A52A2A","AAAAAA","9AC0CD","388E8E","FFFF00","A4483D","8DA71E",
		"7C65A1","4A94B4","D58600","3399CC","9900FF","CC3333","3399CC"
	};
	private static  final Random r=new Random();
	static{//目前先写成这样，以后可以采用配置文件
		SourceColorMap.put("00001", "EE9A00");
		SourceColorMap.put("00002", "BA55D3");
		SourceColorMap.put("00003", "9ACD32");
		SourceColorMap.put("00004", "6A5ACD");
		SourceColorMap.put("20000", "CD0000");
		SourceColorMap.put("20001", "CDAD00");
		SourceColorMap.put("20002", "B0B0B0");
		SourceColorMap.put("20003", "A52A2A");
		SourceColorMap.put("20004", "AAAAAA");
		SourceColorMap.put("20005", "9AC0CD");
		SourceColorMap.put("20006", "388E8E");
		SourceColorMap.put("20007", "FFFF00");
	}
	
	public static String getRandomColor(){
		return randomColors[r.nextInt(randomColors.length)];
	}
	
	public static String getColor(String hbaseKey){
		return SourceColorMap.get(hbaseKey)!=null?SourceColorMap.get(hbaseKey):"6495ED";
	}
	
	 /**
     * 产生报表虚线的策略，参数是每一横条的所有set
     * @param setStr
     * @return
     */
    public static String generateDashed(List<String> setValuesStrs){
    	double pre=0.0;//上一个值
    	int nullSize=0;//没有数值的set的个数
    	int startFullNullResultCount=0;//开始补齐空值的次数，如果是第一次空值，则后面开始有值的时候不需要补齐，因为只有第一次有值到无值才有虚线的必要。-- guokeney
    	int len=setValuesStrs==null?0:setValuesStrs.size();
    	String[] result=new String[len];
    	for(int i=0;i<len;i++){
    		if(setValuesStrs.get(i)==null || "".equals(setValuesStrs.get(i).trim())){
    			//没有值的情况
    			//从某个点开始没有值，但是他的前面一个点也要虚线才有那种效果，虽然是虚线，但是不可以隐藏他的圆点
    			nullSize++;
    			if(i>0){
    				result[i-1]="<set value='"+setValuesStrs.get(i-1)+"' dashed ='1'/>";
    			}
    			continue;
    		}
			double cur=Double.parseDouble(setValuesStrs.get(i));//当前set的value值
			startFullNullResultCount++;
			result[i]="<set value='"+cur+"' />";
			if(nullSize>0 && startFullNullResultCount>1 ){//如果之前存在有空值的set，则要补齐他，补齐的策略是递增
				double has=cur-pre;
				double mean=has/(nullSize+2);//平均值
				//根据nullSize找到之前的某个set
				for(int j=i-nullSize,k=1;j<i;j++,k++){
					setValuesStrs.set(j, String.valueOf(pre+mean*k));
					result[j]="<set value='"+setValuesStrs.get(j)+"' dashed ='1' anchorRadius='0'/>";//没有值的点是虚线，但是不要出现那个圆点
				}
			}
			nullSize=0;
			pre=cur;
    	}
    	StringBuffer sb=new StringBuffer("");
    	for(String str:result){
    		sb.append((str==null || "".equals(str.trim()))?"<set value=''/>":str);//有可能一种情况就是从某个点开始到最后一个点都没有数据，无法实现递增，这时候是完全隐藏
    	}
    	System.out.println("生成的set数据=="+sb.toString());
    	return sb.toString();
    }
    /**
     * 是否符合模版要求，以“|”分割，且第一个是价格，如“1220.0|XXX|XXX|XXX”
     * @param s
     * @return
     */
    public static boolean isLikeFormat(String s){
    	if(s==null || "".equals(s.trim())){
    		return false;
    	}
    	try{
    		Double.parseDouble(s.split("\\|")[0]);
    	}catch(Exception e){return false;}
    	return true;
    }
    
    
    /**
     * 根据模版产生虚线的set
     * @param setValuesStrs
     * @return
     */
    public static String generateDashedByFormat(List<String> formatSetStr,Locale locale){
    	
    	//==========================================测试断点数据
    	double pre=0.0;//上一个值
    	int nullSize=0;//没有数值的set的个数
    	int startFullNullResultCount=0;//开始补齐空值的次数，如果是第一次空值，则后面开始有值的时候不需要补齐，因为只有第一次有值到无值才有虚线的必要。-- guokeney
    	int len=formatSetStr==null?0:formatSetStr.size();
    	String[] result=new String[len];
    	for(int i=0;i<len;i++){
    		String temp=formatSetStr.get(i);
    		if(!isLikeFormat(temp)){//没有值的情况
    			//从某个点开始没有值，但是他的前面一个点也要虚线才有那种效果，虽然是虚线，但是不可以隐藏他的圆点
    			nullSize++;
    			if(i>0 && nullSize==1){
    				//result[i-1]="<set value='"+formatSetStr.get(i-1).split("\\|")[0]+"' dashed ='1' toolText='￥"+formatSetStr.get(i-1)+"'/>";
    				result[i-1]=result[i-1].substring(0,4)+" dashed ='1' "+result[i-1].substring(4);//加上虚点
    			}
    			continue;
    		}
			double cur=Double.parseDouble(temp.split("\\|")[0]);//当前set的value值
			startFullNullResultCount++;
			result[i]="<set value='"+cur+"' toolText='"+(null==I18nUtil.getProperties(locale).get("forms.price")? "价格: ":(I18nUtil.getProperties(locale).get("forms.price")+":"))+" ￥"+temp.replaceAll("\\|","")+"' dashLen='2' dashGap='1'/>";
			if(nullSize>0 && startFullNullResultCount>1){//如果之前存在有空值的set，则要补齐他，补齐的策略是递增
				double has=cur-pre;
				double mean=has/(nullSize+2);//平均值,必须算上前后两点
				//根据nullSize找到之前的某个set
				for(int j=i-nullSize,k=1;j<i;j++,k++){
					formatSetStr.set(j, String.valueOf(pre+mean*k));//把计算好的值放回去
					result[j]="<set value='"+formatSetStr.get(j)+"' dashed ='1' anchorRadius='0' dashLen='2' dashGap='1' />";//没有值的点是虚线，但是不要出现那个圆点
				}
				
			}
			nullSize=0;
			pre=cur;
    	}
    	StringBuffer sb=new StringBuffer("");
    	for(String str:result){
    		sb.append((str==null || "".equals(str.trim()))?"<set value=''/>":str);//有可能一种情况就是从某个点开始到最后一个点都没有数据，无法实现递增，这时候是完全隐藏
    	}
    	//System.out.println("生成的set数据=="+sb.toString());
    	return sb.toString();
    }
    
    
    
    /**
     * 报表都需要指定某一天到前后几天的所有日期，格式全部为yyyy-MM-dd
     * 
     * @param dateStr
     * @param n
     * @return
     * @throws Exception 
     */
    public static List<String> getDatesStr(String dateStr,int n) throws Exception{
    	List<String> finalResult=new ArrayList<String>();
    	if(n<0){
    		Date endDate=strToDate(dateStr);
    		long startTime=endDate.getTime()-OneDay*(-n);
    		for(int i=0;i<=-n;i++){
    			Date d=new Date(startTime+i*OneDay);
    			finalResult.add(dateToStr(d));
    		}
    	}else{
    		long startTime=strToDate(dateStr).getTime();
    		for(int i=0;i<=n;i++){
    			Date d=new Date(startTime+i*OneDay);
    			finalResult.add(dateToStr(d));
    		}
    	}
    	return finalResult;
    }
    

    public static List<String> getDatesStr(String startDate,String endDate)throws Exception{
    	
    	Date start=strToDate(startDate);
    	Date end=strToDate(endDate);
    	long nDay=(end.getTime()-start.getTime())/OneDay;//相差几天
    	return getDatesStr(startDate,(int)nDay);
    }
    /**
     * 替换所有时间的“-”
     * @param dates
     * @return
     */
    public static List<String> getDatesStrFormat(List<String> dates){
    	List<String> finalResult=new ArrayList<String>();
    	for(String d:dates){
    		finalResult.add(d.replaceAll("-", ""));
    	}
    	return finalResult;
    }
    
    /**
     * 对yyyy-MM-dd截取MM-dd
     * @param dates
     * @return
     */
    public static List<String> getDatesStrFormatMMdd(List<String> dates){
    	List<String> finalResult=new ArrayList<String>();
    	for(String d:dates){
    		finalResult.add(d.substring(5));
    	}
    	return finalResult;
    }
    
    /**
     * 获取从某天开始前后第几天的日期
     * @param dateStr
     * @param n
     * @return
     * @throws Exception
     */
    public static String getDateStrAfterN(String dateStr,int n)throws Exception{
    	return SimpleDateFormat.format(getDateAfterN(dateStr,n));
    }
    
    
    public static Date getDateAfterN(String dateStr,int n)throws Exception{
    	return n<0?new Date(strToDate(dateStr).getTime()-OneDay*(-n)):new Date(strToDate(dateStr).getTime()+n*OneDay);
    }
    
    
	/**
	 * 获取每一条的PlaneInfo数据,如果那天木有数据就是null
	 * @param ps
	 * @return
	 */
	public static List<PlaneInfo> getDataByEveryDay(List<PlaneInfo> ps,List<String> days){
		Map<String,PlaneInfo> temp=new HashMap<String,PlaneInfo>();
		List<PlaneInfo> finalResult=new ArrayList<PlaneInfo>();
		for(PlaneInfo p:ps){
			if(p!=null && p.getGrapDateStr()!=null && !"".equals(p.getGrapDateStr().trim())){
				temp.put(p.getGrapDateStr().substring(0,10), p);
			}
		}
		for(String day:days){
			finalResult.add(temp.get(day));
		}
		return finalResult;
	}
	/**
	 *根据PlaneInfo获取每个的最低价格，为了后面的生产<set>,如果空就是""
	 * @param ps
	 * @return
	 */
	public static List<String> getPriceValueByPlaneInfos( List<PlaneInfo> ps){
		List<String> finalResult=new ArrayList<String>();
		for(PlaneInfo p:ps){
			finalResult.add((p==null || p.getLowerPrice()==null)?"":p.getLowerPrice());
		}
		return finalResult;
	}
	/**
	 * 根据PlaneInfo获取每个的最低价格 以及其他类型的模版（暂时定死一套模版，测试用）
	 * @param ps
	 * @return
	 * @throws Exception 
	 */
	public static List<String> getPriceValueByPlaneInfosAndFormat(List<PlaneInfo> ps,Locale locale) throws Exception{
		List<String> finalResult=new ArrayList<String>();
		for(PlaneInfo p:ps){
			finalResult.add((p==null || p.getLowerPrice()==null || "".equals(p.getLowerPrice().trim()))?"":
				(p.getLowerPrice()+" | \n" + (null==I18nUtil.getProperties(locale).get("xmlutil.operators")? "运营商: ":I18nUtil.getProperties(locale).get("xmlutil.operators")) 
						+ (null==I18nUtil.getProperties(locale).get(p.getCarrierName())? p.getCarrierName():I18nUtil.getProperties(locale).get(p.getCarrierName()))+" "
						+p.getFlightId()+" | \n"+ (null==I18nUtil.getProperties(locale).get("xmlutil.flighDates")? "航班日期：":I18nUtil.getProperties(locale).get("xmlutil.flighDates"))  +p.getFlightBatchDate()
						+" | \n"+ (null==I18nUtil.getProperties(locale).get("xmlutil.departureOrArrival")? "起降时间:":I18nUtil.getProperties(locale).get("xmlutil.departureOrArrival")) +subTimeStr(p.getFlightBatchStartTime())+" — "
						+subTimeStr(p.getFlightBatchEndTime())
						+" | \n" + (null==I18nUtil.getProperties(locale).get("forms.source")? "渠道来源: ":(I18nUtil.getProperties(locale).get("forms.source")+":"))  
						+ (null==I18nUtil.getProperties(locale).get(p.getGrabChannel())? p.getGrabChannel():I18nUtil.getProperties(locale).get(p.getGrabChannel()))
						+" | \n"+ (null==I18nUtil.getProperties(locale).get("forms.grabDate")? "抓取时间: ":(I18nUtil.getProperties(locale).get("forms.grabDate")+":"))  +p.getGrapDateStr()));
		}
		return finalResult;
	}
	
	public static List<String> getPriceValueCabin(List<PlaneInfo> ps,Locale locale) throws Exception{
		List<String> finalResult=new ArrayList<String>();
		for(PlaneInfo p:ps){
			if(p!= null && StringUtils.checkList(p.getCabins())){
				CabinEntityVO vo = p.getCabins().get(0);
						finalResult.add((p==null || vo.getPrice() == 0.0)?"":
							(vo.getPrice()+" | \n" + (null==I18nUtil.getProperties(locale).get("xmlutil.operators")? "运营商: ":I18nUtil.getProperties(locale).get("xmlutil.operators")) 
									+ (null==I18nUtil.getProperties(locale).get(p.getCarrierName())? p.getCarrierName():I18nUtil.getProperties(locale).get(p.getCarrierName()))+" "
									+p.getFlightId()
									+" | \n"+ (null==I18nUtil.getProperties(locale).get("xmlutil.flighDates")? "航班日期：":I18nUtil.getProperties(locale).get("xmlutil.flighDates"))
									+p.getFlightBatchDate()
									+" | \n"+ (null==I18nUtil.getProperties(locale).get("xmlutil.departureOrArrival")? "起降时间:":I18nUtil.getProperties(locale).get("xmlutil.departureOrArrival"))
									+subTimeStr(p.getFlightBatchStartTime())+" — "+subTimeStr(p.getFlightBatchEndTime())
									+" | \n" + (null==I18nUtil.getProperties(locale).get("forms.source")? "渠道来源: ":(I18nUtil.getProperties(locale).get("forms.source")+":"))
									+p.getGrabChannel()
									+" | \n"+ (null==I18nUtil.getProperties(locale).get("forms.grabDate")? "抓取时间: ":(I18nUtil.getProperties(locale).get("forms.grabDate")+":"))+p.getGrapDateStr()));
				}
				else{
					finalResult.add(null);
			}
		}
			
		return finalResult;
	}
	
	private static String  formatDate(Date d,String pattern){
		SimpleDateFormat sim=new SimpleDateFormat(pattern);
		return sim.format(d);
	}
	
	//截取时间str yyyyMMddHHmmss  >> HHmm
	//
	private static String subTimeStr(String s){
		if(s==null || s.length()!=14){
			return "";
		}else{
			return s.substring(8,10)+":"+s.substring(10,12);
			//return s;
		}
	}
	
	
	/**
	 *根据PlaneInfo获取每个的最低价格，为了后面的生产<set>,如果空就是"",假设全部为空，则抛出异常,为了可以识别空数据
	 * @param ps
	 * @return
	 * @throws Exception 
	 */
	public static List<String> loadPriceValueByPlaneInfos( List<PlaneInfo> ps) throws Exception{
		int nullCount=0;
		List<String> finalResult=new ArrayList<String>();
		for(PlaneInfo p:ps){
			if(p==null || p.getLowerPrice()==null ||"".equals(p.getLowerPrice().trim())){
				nullCount++;
				finalResult.add("");
				continue;
			}
			finalResult.add(p.getLowerPrice());
		}
		if(nullCount==ps.size()){
			throw new Exception("has no data!");
		}
		return finalResult;
	}
	
	
	public static Date strToDate(String dateStr,String pattern) throws Exception{
		return new SimpleDateFormat(pattern).parse(dateStr);
	}
	
    //yyyy-MM-dd
    public static Date strToDate(String dateStr) throws Exception{
    	return SimpleDateFormat.parse(dateStr);
    }
    //yyyy-MM-dd
    public static String dateToStr(Date date)throws Exception{
    	return SimpleDateFormat.format(date);
    }
    /**
     * 【今天】在【航班日期】之前
     */
    public static boolean todayBeforeFlightDate(String flightDateStr)throws Exception{
    	return new Date().before(SimpleDateFormat.parse(flightDateStr));
    }
    
    
    public static void main(String[] args) throws Exception {
    	System.out.println(isLikeFormat("123"));
	}
}
